#!/bin/bash

# 一键部署脚本 - 适用于Linux系统和WSL环境

# 检查是否在Linux系统或WSL上运行
if [[ "$(uname)" != "Linux" ]]; then
    echo "错误：此脚本仅适用于Linux系统或WSL环境"
    exit 1
fi

# 检测是否为WSL环境
IS_WSL=false
if grep -qE "(Microsoft|WSL)" /proc/version &> /dev/null; then
    IS_WSL=true
    echo "检测到WSL环境"
fi

# 用户须知
clear
echo "==================================================="
echo "                   用户须知"
echo "==================================================="
echo "1. 本脚本将自动安装必要的依赖包和软件，若因此导致系统出现任何问题，本人概不负责；"
echo "2. 本项目为开源项目，由凌宇工作室张金宇岁穗姩编写，未经许可不得用于商业用途；"
echo "3. 项目代码已开源，使用本代码所引发的一切后果由使用者自行承担；"
echo "4. 本脚本仅支持apt包管理工具。"
echo "==================================================="

# 获取用户同意
read -p "请确认是否同意以上条款 (y/n): " AGREE
if [[ "$AGREE" != [Yy] ]]; then
    echo "您未同意用户须知条款，脚本已终止执行。"
    exit 1
fi
echo "感谢您的同意，脚本将继续执行...\n"

# 在WSL环境中，使用当前目录作为部署目录
CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)"
echo "部署目录设置为：$CURRENT_DIR"

# 设置目录路径
MUSIC_DIR="$CURRENT_DIR/music"
BACKEND_DIR="$CURRENT_DIR/后端"
FRONTEND_DIR="$CURRENT_DIR/前端"
CONFIG_JS="$FRONTEND_DIR/js/config.js"

# 提示用户输入配置信息
echo "欢迎使用凌宇音乐一键部署脚本！"
echo "----------------------------------"

# 获取用户输入的端口，默认为15001
read -p "请输入音乐服务器端口号 (默认: 15001): " PORT_INPUT
PORT=${PORT_INPUT:-15001}

# 验证端口号是否为数字
if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then
    echo "错误：端口号必须是数字"
    exit 1
fi

# 获取用户输入的网站名称，默认为"凌宇音乐"
read -p "请输入音乐网站名称 (默认: 凌宇音乐): " SITE_NAME_INPUT
SITE_NAME=${SITE_NAME_INPUT:-凌宇音乐}

# 创建音乐目录（如果不存在）
echo "正在检查音乐目录..."
if [ ! -d "$MUSIC_DIR" ]; then
    echo "创建音乐目录: $MUSIC_DIR"
    mkdir -p "$MUSIC_DIR"
else
    echo "音乐目录已存在: $MUSIC_DIR"
fi

# 更新前端配置文件
echo "正在更新前端配置..."

# 备份原配置文件
if [ -f "$CONFIG_JS" ]; then
    cp "$CONFIG_JS" "$CONFIG_JS.bak"
fi

# 生成新的配置文件
cat > "$CONFIG_JS" << EOF
// 前端配置文件 - 由run.sh自动生成
const config = {
    // 后端API基础地址
    apiBaseUrl: 'http://localhost:$PORT',
    // 网站名称
    siteName: '$SITE_NAME'
};

// 尝试从URL参数中获取自定义端口
const urlParams = new URLSearchParams(window.location.search);
const customPort = urlParams.get('port');

// 如果URL中指定了有效端口，则更新API地址
if (customPort && /^[0-9]+$/.test(customPort)) {
    config.apiBaseUrl = 'http://localhost:' + customPort;
}

// 允许从外部修改配置
function updateConfig(newConfig) {
    Object.assign(config, newConfig);
    // 更新网站标题
    if (newConfig.siteName) {
        document.title = newConfig.siteName;
        const logoElements = document.querySelectorAll('.logo span');
        logoElements.forEach(el => el.textContent = newConfig.siteName);
    }
    // 更新API基础地址
    if (newConfig.apiBaseUrl) {
        // 通知应用API地址已更改
        const event = new CustomEvent('apiBaseUrlChanged', { detail: newConfig.apiBaseUrl });
        window.dispatchEvent(event);
    }
}
EOF

echo "前端配置已更新"

# 更新HTML中的网站标题和logo
echo "正在更新网站标题和Logo..."
HTML_FILE="$FRONTEND_DIR/index.html"

# 备份原HTML文件
if [ -f "$HTML_FILE" ]; then
    cp "$HTML_FILE" "$HTML_FILE.bak"
fi

# 更新标题和logo文本
sed -i "s/<title>.*<\/title>/<title>$SITE_NAME<\/title>/g" "$HTML_FILE"
sed -i "s/<span>.*<\/span>$/<span>$SITE_NAME<\/span>/" "$HTML_FILE"

echo "网站标题和Logo已更新为: $SITE_NAME"

# 检查apt包管理工具
echo "正在检查apt包管理工具..."
if ! command -v apt &> /dev/null; then
    echo "错误：未检测到apt包管理工具。"
    echo "本脚本支持使用apt的Linux发行版，包括但不限于："
    echo "- Ubuntu"
    echo "- Debian"
    echo "- Kali Linux"
    echo "- Linux Mint"
    echo "- elementary OS"
    exit 1
fi

# 获取当前Linux发行版信息
if [ -f /etc/os-release ]; then
    . /etc/os-release
    echo "检测到发行版：$NAME ($VERSION_ID)"
fi

# 配置非交互式apt环境
export DEBIAN_FRONTEND=noninteractive
export DEBCONF_NONINTERACTIVE_SEEN=true

# 使用apt安装必要的依赖
echo "正在更新软件包列表..."
apt update -y -qq > /dev/null

# 检查并安装Node.js
echo "正在检查Node.js环境..."
if ! command -v node &> /dev/null; then
    echo "未检测到Node.js，正在通过apt安装..."
    apt install -y -qq nodejs > /dev/null
    if ! command -v node &> /dev/null; then
        echo "错误：Node.js安装失败，请手动安装后再运行脚本。"
        exit 1
    fi
else
    NODE_VERSION=$(node -v)
    echo "已检测到Node.js $NODE_VERSION"
fi

# 检查并安装npm
echo "正在检查npm环境..."
if ! command -v npm &> /dev/null; then
    echo "未检测到npm，正在通过apt安装..."
    apt install -y -qq npm > /dev/null
    if ! command -v npm &> /dev/null; then
        echo "错误：npm安装失败，请手动安装后再运行脚本。"
        exit 1
    fi
else
    NPM_VERSION=$(npm -v)
    echo "已检测到npm $NPM_VERSION"
fi

# 清理非交互式环境变量
unset DEBIAN_FRONTEND
unset DEBCONF_NONINTERACTIVE_SEEN

# 安装后端依赖
echo "正在安装后端依赖..."
cd "$BACKEND_DIR"
npm install

# 获取本机IP地址
IP_ADDRESS=$(hostname -I | awk '{print $1}')

# 设置项目文件权限
if [ "$IS_WSL" = true ]; then
    echo "WSL环境下，简化权限设置..."
    # 在WSL中，确保音乐目录可写即可
else
    echo "正在设置项目文件权限..."
    chown -R nobody:nogroup "$CURRENT_DIR"
    chmod -R 755 "$CURRENT_DIR"
fi

# 确保音乐目录可写
chmod 777 "$MUSIC_DIR"

echo "项目文件权限已设置"

# 启动后端服务器
echo "\n正在启动音乐服务器..."
echo "----------------------------------"
echo "部署信息："
echo "- 服务器端口：$PORT"
echo "- 网站名称：$SITE_NAME"
echo "- 音乐文件夹：$MUSIC_DIR"
echo "- 后端目录：$BACKEND_DIR"
echo "- 前端目录：$FRONTEND_DIR"
echo "- 本机IP：$IP_ADDRESS"
echo "- 部署根目录：$CURRENT_DIR"
if [ "$IS_WSL" = true ]; then
    echo "- 环境类型：WSL (Windows Subsystem for Linux)"
    echo "  提示：在WSL环境中，也可以通过Windows的IP访问服务"
fi
echo "----------------------------------"
echo "服务器启动后，请在浏览器中访问：http://$IP_ADDRESS:$PORT"
echo "或：http://localhost:$PORT"
if [ "$IS_WSL" = true ]; then
    echo "或在Windows浏览器中访问：http://localhost:$PORT"
echo "\n提示：请将音乐文件按照要求的结构放入 $MUSIC_DIR 目录"
echo "按Ctrl+C可以停止服务器"
echo "----------------------------------"

# 进入后端目录并启动服务器
cd "$BACKEND_DIR"
PORT=$PORT MUSIC_DIR=$MUSIC_DIR npm start